package com.adee.java;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

public class Test026_Semaphore {
    public static void main(String[] args) {

    }

    /*
    * Semaphore表示信号量，可以设置许可的个数，表示允许最多多少个线程同时使用该信号量，通过acquire()来获取许可，如果没有许可可用，则
    * 线程阻塞，并通过AQS来排队，可以通过release()方法来释放许可，当某个线程释放了许可后，会从AQS中正在排队的第一个线程开始依次唤醒，
    * 知道没有空闲许可。
    * Semaphore可用于流量控制，比如一个资源，最多允许多少个线程来访问。
    * */
    public static void test1() {
        Semaphore semaphore = new Semaphore(3);
        ExecutorService threadPool = Executors.newFixedThreadPool(10);
        for (int i = 0; i < 10; i++) {
            threadPool.submit(() -> {
                for(;;) {
                    try {
                        semaphore.acquire();
                        // do something
                    } finally {
                        semaphore.release();
                    }
                }
            });
        }
    }
}
